﻿// testvector.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    vector<int> vd1(10);
    vector<int> vd2{ 1, 2, 3, 4, 5 };
    vector<string> vs1{ "ss1", "ss2", "ss3" };

    {
        vector<string>vs;
        vs.push_back("test");
        vs.emplace_back("test");
    }

    //增加、删除、修改、查找
    {
        vector<int> datas;
        datas.push_back(10);
        datas.push_back(11);
        datas.push_back(12);
        datas[0] = 99;

        //三种遍历
        //for (int i = 0; i < datas.size(); i++)
            //cout << datas[i] << " ";
        //cout << "\n";

        //for (auto itr = datas.begin(); itr != datas.end(); itr++)
            //cout << *itr << ",";
        //cout << "\n";

        //c++11
        //for (auto& d : datas)
            //cout << d << "|";
        //cout << "\n";
  
    }

    {
        // vector 搜索 删除 插入
        /*vector<int> datas{
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            5, 12, 3312, 332, 11
        };*/
        // 打乱版
        vector<int> datas{
            13, 14, 15, 4, 5, 6, 7, 8, 9, 10,
            5, 12, 3312, 332, 11
        };
        auto f = find(datas.begin(), datas.end(), 11);
        if (f != datas.end())
        {
            //cout << "find " << *f<<" in "<< f - datas.begin() << endl;
            //datas.erase(f);
        }
        //f = find(datas.begin(), datas.end(), 3312);
        //datas.insert(f, 3311);
        //datas.insert(datas.begin() + 2, 99); // 第3个位置插入99


        int fdata = 5;
        vector<int> datapos;
        for (int i = 0; i < datas.size(); i++)
        {
            if (datas[i] == fdata)
            {
                datapos.push_back(i);
            }
        }
        //for (auto p : datapos)
            //cout << p << " ";
        //cout << endl;

        // 删除所有找到的fdata
        //for (int i = datas.size() - 1; i >= 0; i--) {
            //if (datas[i] == fdata)
                //datas.erase(datas.begin() + i);
        //}
        for (int i = datapos.size() - 1; i >= 0; i--) {
            //datas.erase(datas.begin() + datapos[i]);
        }

        // 正序排序
        //sort(datas.begin(), datas.end());
        // 倒序
        sort(datas.begin(), datas.end(), greater<int>());
        
        //for (auto d : datas)
            //cout << d << "-";
        //cout << endl;
    }

    // vector的效率
    {
        vector<int> v1;
        vector<int> vdata(10);
        cout << "v1.size(): " << v1.size() << endl; //size()存储元素数量
        cout << "vdata.size(): " << vdata.size() << endl;

        cout << "v1.capacity(): " << v1.capacity() << endl; // 实际存储空间
        cout << "vdata.capacity(): " << vdata.capacity() << endl;

        v1.resize(8); //扩充元素数量
        v1.reserve(16); //扩充内存数量
        cout << "v1.size(): " << v1.size() << endl; //size()存储元素数量
        cout << "v1.capacity(): " << v1.capacity() << endl; // 实际存储空间

        v1.push_back(99);
        for (auto v : v1)
            cout << v << "|";
        cout << endl;

        v1.clear(); //清空所有元素
        v1.shrink_to_fit();//释放多余的内存，内存适应元素
        cout << "v1.size(): " << v1.size() << endl; //size()存储元素数量
        cout << "v1.capacity(): " << v1.capacity() << endl; // 实际存储空间
        cout << "------\n";
        int c = 0;
        for (int i = 0; i < 200; i++)
        {
            v1.push_back(i);
            if (c != v1.capacity())
            {
                cout << "v1.capacity()" << c << endl;
            }
            c = v1.capacity();
        }


    }
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
